﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Json;
using System.Text.RegularExpressions;
using System.Runtime.Serialization.Json;
using System.IO;
using Newtonsoft.Json;

namespace ODP.Helper
{
    public static class JsonHelper
    {
        public static string GetValueByName(string jsonString,string name)
        {
            string result = string.Empty;

            JsonTextParser jtp = new JsonTextParser();

            JsonObjectCollection joc = jtp.Parse(jsonString) as JsonObjectCollection;
            JsonArrayCollection jocarr = jtp.Parse(jsonString) as JsonArrayCollection;
            if (joc != null)
            {
                foreach (JsonObject jo in joc)
                {
                    if (jo.Name == name)
                    {
                        var joctemp = (jo as JsonObjectCollection);
                        var jocarrtemp = (jo as JsonArrayCollection);
                        if (joctemp == null && jocarrtemp == null)
                        {
                            result = Convert.ToString(jo.GetValue());
                        }
                        else
                        {
                            result = jo.ToString();
                        }
                        break;
                    }
                    else
                    {
                        JsonObjectCollection temp = (jo as JsonObjectCollection);
                        JsonArrayCollection jactemp = (jo as JsonArrayCollection);
                        if (temp != null && temp.Count > 0)
                        {
                            result = GetValueByName(temp, name);

                            if (!string.IsNullOrEmpty(result))
                            {
                                break;
                            }
                        }
                        else if (jactemp != null && jactemp.Count > 0)
                        {

                            result = GetValueByName(jactemp, name);

                            if (!string.IsNullOrEmpty(result))
                            {
                                break;
                            }
                        }
                    }
                }
            }
            else
            {
                if (jocarr != null)
                {
                    result = GetValueByName(jocarr, name);
                }
            }

            return result;
        }

        public static string GetValueByName(JsonObjectCollection joc, string name)
        {
            string result = string.Empty;

            foreach (JsonObject jo in joc)
            {
                if (jo.Name == name)
                {
                    var joctemp = (jo as JsonObjectCollection);
                    var jocarrtemp = (jo as JsonArrayCollection);
                    if (joctemp == null && jocarrtemp == null)
                    {
                        result = Convert.ToString(jo.GetValue());
                    }
                    else
                    {
                        result = jo.ToString();
                    }
                    break;
                }
                else
                {
                    JsonObjectCollection temp = (jo as JsonObjectCollection);
                    JsonArrayCollection jactemp = (jo as JsonArrayCollection);
                    if (temp != null && temp.Count > 0)
                    {
                        result = GetValueByName(temp, name);

                        if (!string.IsNullOrEmpty(result))
                        {
                            break;
                        }
                    }
                    else if (jactemp != null && jactemp.Count > 0)
                    {

                        result = GetValueByName(jactemp, name);

                        if (!string.IsNullOrEmpty(result))
                        {
                            break;
                        }
                    }
                }
            }

            return result;
        }

        public static string GetValueByName(JsonArrayCollection joc, string name)
        {
             string result = string.Empty;

             foreach (JsonObject jo in joc)
             {
                 if (jo.Name == name)
                 {
                     var joctemp = (jo as JsonObjectCollection);
                     var jocarrtemp = (jo as JsonArrayCollection);

                     if (joctemp == null && jocarrtemp == null)
                     {
                         result = Convert.ToString(jo.GetValue());
                     }
                     else
                     {
                         result = jo.ToString();
                     }
                     break;
                 }
                 else
                 {
                     JsonObjectCollection temp = (jo as JsonObjectCollection);
                     JsonArrayCollection jactemp = (jo as JsonArrayCollection);
                     if (temp != null && temp.Count > 0)
                     {
                         result = GetValueByName(temp, name);

                         if (!string.IsNullOrEmpty(result))
                         {
                             break;
                         }
                     }
                     else if (jactemp != null && jactemp.Count > 0)
                     {

                         result = GetValueByName(jactemp, name);

                         if (!string.IsNullOrEmpty(result))
                         {
                             break;
                         }
                     }
                 }
             }

             return result;
        }

        public static T GetJsonObeject<T>(string jsonString)
        {
            T deserialized = JsonConvert.DeserializeObject<T>(jsonString);

            return deserialized;
        }

        public static object GetJsonObject(string jsonString)
        {
            return JsonConvert.DeserializeObject(jsonString);
        }

        /// <summary>
        /// JSON序列化
        /// </summary>
        public static string JsonSerializer<T>(T t)
        {
            DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
            MemoryStream ms = new MemoryStream();
            ser.WriteObject(ms, t);
            string jsonString = Encoding.UTF8.GetString(ms.ToArray());
            ms.Close();
            //替换Json的Date字符串
            string p = @"\\/Date\((\d+)\+\d+\)\\/";
            MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString);
            Regex reg = new Regex(p);
            jsonString = reg.Replace(jsonString, matchEvaluator);
            return jsonString;
        }

        /// <summary>
        /// JSON反序列化
        /// </summary>
        public static T JsonDeserialize<T>(string jsonString)
        {
            //将"yyyy-MM-dd HH:mm:ss"格式的字符串转为"\/Date(1294499956278+0800)\/"格式
            string p = @"\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}";
            MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertDateStringToJsonDate);
            Regex reg = new Regex(p);
            jsonString = reg.Replace(jsonString, matchEvaluator);
            DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
            MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
            T obj = (T)ser.ReadObject(ms);
            return obj;
        }

        /// <summary>
        /// JSON反序列化
        /// </summary>
        public static T JsonDeserialize<T>(string jsonString, bool isConvertDateTime)
        {
            //将"yyyy-MM-dd HH:mm:ss"格式的字符串转为"\/Date(1294499956278+0800)\/"格式
            string p = @"\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}";
            if (isConvertDateTime)
            {
                MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertDateStringToJsonDate);
                Regex reg = new Regex(p);
                jsonString = reg.Replace(jsonString, matchEvaluator);
            }

            DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
            MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
            T obj = (T)ser.ReadObject(ms);
            return obj;
        }

        /// <summary>
        /// 将Json序列化的时间由/Date(1294499956278+0800)转为字符串
        /// </summary>
        private static string ConvertJsonDateToDateString(Match m)
        {
            string result = string.Empty;
            DateTime dt = new DateTime(1970, 1, 1);
            dt = dt.AddMilliseconds(long.Parse(m.Groups[1].Value));
            dt = dt.ToLocalTime();
            result = dt.ToString("yyyy-MM-dd HH:mm:ss");
            return result;
        }


        /// <summary>
        /// 将时间字符串转为Json时间
        /// </summary>
        private static string ConvertDateStringToJsonDate(Match m)
        {
            string result = string.Empty;
            DateTime dt = DateTime.Parse(m.Groups[0].Value);
            dt = dt.ToUniversalTime();
            TimeSpan ts = dt - DateTime.Parse("1970-01-01");
            result = string.Format("\\/Date({0}+0800)\\/", ts.TotalMilliseconds);
            return result;
        }

        public static string FormatJsonDateTime(string timestr)
        {
            System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo("en-US");
            DateTime dt = DateTime.ParseExact(timestr, "ddd MMM dd HH:mm:ss zzz yyyy", ci);
            return dt.ToString("yyyy-MM-dd HH:mm");
        }
    }
}
